#include "../../includes/model/ServidorClientes.h"

namespace model
{
	ServidorClientes::ServidorClientes( QString &path ) : path( path ){

		file = new QFile( path );

		if( file->exists() )
		{
			restore();

			QString s( "Carregados: %1 clientes em %2." );

			s = s.arg( clientes.size() ).arg( path );

			controller::Logger::write( s );

			file->open( QIODevice::ReadOnly );
		}
		else
		{
			file->open( QIODevice::WriteOnly );
		}

		if( ! file->isOpen() )
		{
			QString *e = new QString();

			e->append(
				QString( "Base de clientes %1 nao pode ser aberta: %2" )
				.arg( path ).arg( file->errorString() )
			);

			delete file;

			throw e;
		}

		file->close();

		if( clientes.size() == 0 )
		{
			QString admin("admin");

			Cliente *adm = new Cliente( admin );

			clientes.push_back( adm );

			admin = "admin2";

			adm = new Cliente( admin );

			clientes.push_back( adm );
		}

	}

	void ServidorClientes::save()
	{
		file->open( QIODevice::ReadWrite );

		file->remove();

		file->open( QIODevice::WriteOnly );

		QDataStream ds( file );

		ds << clientes;

		file->flush();

		file->close();
	}

	void ServidorClientes::restore()
	{
		file->open( QIODevice::ReadOnly );

		QDataStream ds( file );

		ds >> clientes;

		file->close();

	}

	Cliente* ServidorClientes::_getCliente( const QString &nome )
	{
		QList<Cliente*>::iterator it;

		Cliente *tmp;

		for( it = clientes.begin(); it != clientes.end(); it++ )
		{
			tmp = *it;

			if( tmp->getNome() == nome )
			{
				return tmp;
			}
		}

		return NULL;
	}

	Cliente* ServidorClientes::getCliente( const QString &nome )
	{

		Cliente *tmp = _getCliente( nome );

		QString *s = new QString();

		if( tmp == NULL )
		{
			s->append( QString( "Cliente %1 nao encontrado." ).arg( nome ) );
			throw s;
		} else if( tmp->isLogado() )
		{
			s->append( QString( "Cliente %1 ja esta logado." ).arg( nome ) );
			throw s;
		}

		delete s;

		tmp->setLogado( true );
		return tmp;
	}

	Cliente* ServidorClientes::cadastrarCliente( const QString &nome )
	{
		Cliente *c = _getCliente( nome );

		if( c != NULL )
		{
		    QString *m = new QString();
		    m->append( QString( " Cliente %1 ja esta cadastrado" ).arg( c->getNome() ) );

		    throw m;
		}

		c = new Cliente( nome );
		c->setLogado( true );

		clientes.push_back( c );

		return c;
	}

	void ServidorClientes::logoutCliente( Cliente *c )
	{
		c->removeTodosArquivos();
		c->setLogado( false );
	}

	ServidorClientes::~ServidorClientes()
	{
		delete file;
	}
}
